<?php
require_once("Campo.php");

class Tabla{

	//Atributos de la clase
	var $txtConsulta;
	var $txtNombreTabla;
	var $txtAlias;
	var $txtTabla;
	var $arrPropiedades;
	var $Orden;
	var $Conexion;
	var $esBase;
	
	//Constructores de la clase
	function Tabla(&$conexion, $alias = ""){
		$this->esBase = 0;
		$this->Conexion = &$conexion;	
		$this->Orden = 0;
		$this->txtAlias = $alias;
		$this->txtTabla = $this->txtNombreTabla;
		if($alias == ""){
			$this->txtAlias = $this->txtNombreTabla;
		}
	}
	
	//Funciones para establecer propiedades
	function estConexion(&$conexion){
		$this->Conexion = &$conexion;
	}
	function estTxtBDatos($NombreBase){
		$this->txtBDatos = $NombreBase;
	}
	function estTxtConsulta($txtConsulta){
		$this->txtConsulta = $txtConsulta;
	}
	function estOrden($orden){
		$this->Orden = $orden;
	}
	function estPropiedad($nombrePropiedad, $valorPropiedad){
		$this->arrPropiedades[$nombrePropiedad]['valor'] = $valorPropiedad;
	}
	function estEsBase($base){
		$this->esBase = $base;
	}
	function esttxtAlias($alias){
		$this->txtAlias = $alias;
	}
	//Funciones para obtener propiedades
	function &obtConexion(){
		return $this->Conexion;
	}
	function obttxtConsulta(){
		return $this->txtConsulta;
	}
	function obttxtNombreTabla(){
		return $this->txtNombreTabla;
	}
	function obttxtTabla(){
		return $this->txtTabla;
	}
	function obttxtAlias(){
		return $this->txtAlias;
	}
	function obtarrCampos(){
		return $this->arrPropiedades;
	}
	function obtOrden(){
		return $this->Orden;
	}
	function obtPropiedad($nombrePropiedad, $item){
		return $this->arrPropiedades[$nombrePropiedad][$item];
	}
	
	function obtEsBase(){
		return $this->esBase;
	}
		
	//Funciones de acceso a Base de Datos
	
	function obtTodos(){
		$consultas[0] = "SELECT * FROM ".$this->txtNombreTabla;
		$rdo = $this->Conexion->Ejecutar($consultas);
		return $rdo[0];
	}
	
	function obtConsulta($arrColumnas, $arrAlias="", $strCondicion = ""){
		$this->txtConsulta = "SELECT ";
		$k=0;
		while($k < count($arrColumnas)){
			if($k > 0){
				$this->txtConsulta .= ", ";
			}	
			$this->txtConsulta .= $arrColumnas[$k];
			
			if(isset($arrAlias[$k])){
				$this->txtConsulta .= " as \"". $arrAlias[$k] ."\"";
			}
			$k++;
		}
		
		$this->txtConsulta .= " FROM ".$this->txtNombreTabla;
		
		if($strCondicion != ""){
			$this->txtConsulta .= " WHERE ".$strCondicion;
		}
		
		$consultas[0] = $this->txtConsulta;
		$rdo = $this->Conexion->Ejecutar($consultas);
		
		return $rdo[0];
		
	}
	
	function obtUno(){
		$k=0;
		$arr_campos = array_keys($this->arrPropiedades);
		$this->txtConsulta .= "SELECT * FROM ". $this->txtNombreTabla . " WHERE ";
		while($k < count($arr_campos)){
			$campo_actual = $arr_campos[$k];
			if($this->arrPropiedades[$campo_actual]['primary_key'] == 1){
				if(isset($paso)){
					$this->txtConsulta .= " AND ";
				}
				$this->txtConsulta .= $arr_campos[$k] . " = ";
				$this->txtConsulta .= "\"";
				$this->txtConsulta .= $this->arrPropiedades[$campo_actual]['valor'];
				$this->txtConsulta .= "\"";
				$paso = 1;
			}
			$k++;
		}
		$consultas[0] = $this->txtConsulta;
		$rdo = $this->Conexion->Ejecutar($consultas);
		return $rdo[0];
		
	}
	
	function obtarrClaves(){
		$i=0;
		$j=0;
		$arrCampos = array_keys($this->arrPropiedades);
		foreach($this->arrPropiedades as $rowPropiedad){
			if($rowPropiedad['primary_key'] == 1){
				$arrCalves[$i] = $arrCampos[$j];
				$i++;
			}
			$j++;
		}
		return $arrCalves;
	}
	
	function Insertar()	{
		$arr_campos = array_keys($this->arrPropiedades);
		$k=0;
		$ban=0;
		$this->txtConsulta = "INSERT INTO ".$this->txtNombreTabla." (";
		while($k < count($arr_campos)){
			$campo_actual = $arr_campos[$k];
									
			if($this->arrPropiedades[$campo_actual]['auto_increment'] < 1){
				if($this->arrPropiedades[$campo_actual]['valor'] != ""){
					if($ban > 0){
						$this->txtConsulta .= ", ";
					}	
					$this->txtConsulta .= $arr_campos[$k];
					$ban=1;
				}
			}
			$k++;
		}
		
		$k=0;	
		$ban=0;	
		$this->txtConsulta .= ") VALUES(";
		while($k < count($arr_campos)){
			$campo_actual = $arr_campos[$k];
									
			if($this->arrPropiedades[$campo_actual]['auto_increment'] < 1){
				if($this->arrPropiedades[$campo_actual]['valor'] != ""){
					if($ban > 0){
						$this->txtConsulta .= ", ";
					}
						$this->txtConsulta .= "\"";
						$this->txtConsulta .= $this->arrPropiedades[$campo_actual]['valor'];
						$this->txtConsulta .= "\"";
						$ban=1;
					
				}
			}
			$k++;
		}
		$this->txtConsulta .= ")";
		
			$consultas[0] = $this->txtConsulta;
			$consultas[1] = "SELECT DISTINCT LAST_INSERT_ID( ) FROM ".$this->txtNombreTabla;

			$id = $this->Conexion->Ejecutar($consultas);
			return $id[1];

	}
	
	function Borrar()	{
		$arr_campos = array_keys($this->arrPropiedades);
		$k=0;

		$this->txtConsulta = "DELETE FROM " . $this->txtNombreTabla . " WHERE ";
		while($k < count($this->arrPropiedades)){
			$campo_actual = $arr_campos[$k];
			if($this->arrPropiedades[$campo_actual]['primary_key'] == 1){
				if(isset($paso)){
					$this->txtConsulta .= " and ";
				}
				$this->txtConsulta .= $campo_actual. " = ";
				$this->txtConsulta .= "\"";
				$this->txtConsulta .= $this->arrPropiedades[$campo_actual]['valor'];
				$this->txtConsulta .= "\"";
				$paso = 1;
			}
			$k++;
		}
		
		$consultas[0] = $this->txtConsulta;
		$this->Conexion->Ejecutar($consultas);
	}
	
	function Modificar(){
		$arr_campos = array_keys($this->arrPropiedades);
		$k=0;

		$this->txtConsulta = "UPDATE " . $this->txtNombreTabla . " SET ";
		$coma = "";
		while($k < count($arr_campos)){
			$campo_actual = $arr_campos[$k];
			if($this->arrPropiedades[$campo_actual]['primary_key'] == 0){
				if($this->arrPropiedades[$campo_actual]['valor'] != ""){
					$this->txtConsulta .= $coma . $arr_campos[$k] . " = ";
					
					$comilla ="\"";
					if($this->arrPropiedades[$campo_actual]['valor'] == "NULL"){
						$comilla = "";
					}
					$this->txtConsulta .= $comilla;
					$this->txtConsulta .= $this->arrPropiedades[$campo_actual]['valor'];
					$this->txtConsulta .= $comilla;
					$coma = ", ";
				}
			}
			$k++;
		}
		$this->txtConsulta .= " WHERE ";
		$k=0;
		while($k < count($arr_campos)){
			$campo_actual = $arr_campos[$k];
			if($this->arrPropiedades[$campo_actual]['primary_key'] == 1){
				$this->txtConsulta .= $arr_campos[$k] . " = ";
				$this->txtConsulta .= "\"";
				$this->txtConsulta .= $this->arrPropiedades[$campo_actual]['valor'];
				$this->txtConsulta .= "\"";
				if(($k+1) < count($arr_campos)){
					if($this->arrPropiedades[$arr_campos[$k+1]]['primary_key'] == 1){
						$this->txtConsulta .= " AND ";
					}
				}
			}
			$k++;
		}
		
		$consultas[0] = $this->txtConsulta;
		$rdo = $this->Conexion->Ejecutar($consultas);
		return $rdo[0];
	}
	
	function &obtCampo($nombreCampo, $alias=''){
		if(isset($this->arrPropiedades[$nombreCampo])){
			$campo = new Campo($this, $nombreCampo);
			$campo->estNombre($nombreCampo);
			if($alias != ''){
				$campo->estAlias($alias);
			}
			$campo->estEsBase($this->obtEsBase());
			return $campo;
		}
		else{
			die("La columna ". $nombreCampo . "no existe en " . $this->obttxtNombreTabla());
		}
		
	}
	
	function &obtCamposClave(){
		$nombresClave = array_keys($this->obtNombresClaves());
		foreach($nombresClave as $nomClave){
			$claves[$nomClave] = &$this->obtCampo($nomClave);
		}
		return $claves;
	}
	
	function obtNombresClaves(){
		$claves = "";
		
		$nombres = array_keys($this->obtarrCampos());
		foreach($nombres as $propiedad){
			$propiedades = $this->obtarrCampos();
			if($propiedades[$propiedad]['primary_key'] == 1){
				$claves[$propiedad] = "";
			}
		}
		return $claves;
	}

}

?>